package co.sumset.vista;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

import co.sumset.conexion.ConexionPartida;
import co.sumset.conexion.ConexionUsuario;
import co.sumset.entidades.Usuario;
import co.sumset.log.MiLogger;
import co.sumset.objetos.Escenario;
import co.sumset.validacion.Validacion;




/**
 * This code was edited or generated using CloudGarden's Jigloo
 * SWT/Swing GUI Builder, which is free for non-commercial
 * use. If Jigloo is being used commercially (ie, by a corporation,
 * company or business for any purpose whatever) then you
 * should purchase a license for each developer using Jigloo.
 * Please visit www.cloudgarden.com for details.
 * Use of Jigloo implies acceptance of these licensing terms.
 * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
 * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
 * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
 */
public class VentanaPrincipal extends javax.swing.JFrame implements ActionListener{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JLabel fondo;
	private JLabel tiutloPrincipal;
	private JButton btnCrearCuenta;
	private JButton btnIniciarSesion;
	private JSeparator SeparatorAba;
	private JSeparator SeparatorIzq;
	private JSeparator SeparatorDer;
	private JSeparator SeparadorArri;
	private JLabel jlbTituloCorreo;
	private JTextField jtfCampoCorreo;
	private JLabel jLabel1;
	private JPasswordField jpfCampoClave;

	private VentanaRegistro ventanaRegistro;
	private JLabel etiquetaInstrucciones;
	private VentanaFin ventanaFin;

	private Administrador admin;

	private ConexionPartida conexionPartida;
	private ConexionUsuario conexionUsuario;

	private Validacion validacion;

	private  MiLogger logger = new MiLogger();



	private Thread hiloInicial = new Thread(new Runnable() {public void run() {iniciarJuego();}

	private void iniciarJuego() 
	{

		admin.game();
	}});
	private Usuario usuario;
	private VentanaInformacion ventanaInformacion=null;

	public VentanaPrincipal() 
	{
		super();

		initGUI();

		conexionUsuario = new ConexionUsuario();
		conexionPartida = new ConexionPartida();
		validacion= new Validacion();

		ventanaRegistro= new VentanaRegistro(this);
		ventanaInformacion = new VentanaInformacion(this);
		ventanaFin = new VentanaFin(this);

	}

	private void initGUI() 
	{
		try {
			this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
			getContentPane().setLayout(null);
			this.setTitle("Body Invaders-Inicio");
			this.setResizable(false);
			this.setLocationRelativeTo(null);
			this.setBounds(0, 0, 614, 384);
			this.setIconImage(new ImageIcon(getClass().getClassLoader().getResource("res/juego/inv02.png")).getImage());
			{
				tiutloPrincipal = new JLabel();
				getContentPane().add(getTiutloPrincipal());
				tiutloPrincipal.setLayout(null);
				tiutloPrincipal.setBounds(170, 5, 250, 70);
				tiutloPrincipal.setFont(new java.awt.Font("Arnprior",1,48));
				tiutloPrincipal.setForeground(new java.awt.Color(255,255,255));
				tiutloPrincipal.setIcon(new ImageIcon(getClass().getClassLoader().getResource("res/titulos/titulo01.png")));
			}
			{
				btnCrearCuenta = new JButton();
				getContentPane().add(btnCrearCuenta);
				btnCrearCuenta.setLayout(null);
				btnCrearCuenta.setBounds(213, 276, 160, 60);
				btnCrearCuenta.setIcon(new ImageIcon(getClass().getClassLoader().getResource("res/botones/btnCrearCuenta.png")));
				btnCrearCuenta.addActionListener(this);
			}
			{
				btnIniciarSesion = new JButton();
				getContentPane().add(btnIniciarSesion);
				btnIniciarSesion.setBounds(212, 212, 160, 60);
				btnIniciarSesion.setIcon(new ImageIcon(getClass().getClassLoader().getResource("res/botones/btnIniciarSesion.png")));
				btnIniciarSesion.addActionListener(this);
			}
			{
				jpfCampoClave = new JPasswordField();
				getContentPane().add(jpfCampoClave);
				jpfCampoClave.setBounds(209, 184, 169, 23);
			}
			{
				jLabel1 = new JLabel();
				getContentPane().add(jLabel1);
				jLabel1.setText("Clave:");
				jLabel1.setBounds(210, 167, 70, 16);
				jLabel1.setFont(new java.awt.Font("Arial Rounded MT Bold",0,14));
				jLabel1.setBackground(new java.awt.Color(255,255,255));
				jLabel1.setForeground(new java.awt.Color(0,0,0));
			}
			{
				jtfCampoCorreo = new JTextField();
				getContentPane().add(jtfCampoCorreo);
				jtfCampoCorreo.setBounds(209, 137, 169, 23);
			}
			{
				jlbTituloCorreo = new JLabel();
				getContentPane().add(jlbTituloCorreo);
				jlbTituloCorreo.setText("Correo:");
				jlbTituloCorreo.setBounds(209, 120, 70, 16);
				jlbTituloCorreo.setFont(new java.awt.Font("Arial Rounded MT Bold",0,14));
				jlbTituloCorreo.setBackground(new java.awt.Color(255,255,255));
				jlbTituloCorreo.setForeground(new java.awt.Color(0,0,0));
			}
			{
				SeparadorArri = new JSeparator();
				FlowLayout SeparatorIzqLayout = new FlowLayout();
				getContentPane().add(getSeparadorArri());
				SeparadorArri.setLayout(null);
				SeparadorArri.setBounds(198, 114, 191, 10);

			}
			{
				SeparatorAba = new JSeparator();
				getContentPane().add(SeparatorAba);
				SeparatorAba.setLayout(null);
				SeparatorAba.setBounds(198, 341, 191, 10);
			}
			{
				SeparatorDer = new JSeparator();
				getContentPane().add(getSeparatorDer());
				SeparatorDer.setLayout(null);
				SeparatorDer.setBounds(388, 115, 10, 227);
				SeparatorDer.setOrientation(SwingConstants.VERTICAL);
			}
			{
				SeparatorIzq = new JSeparator();
				getContentPane().add(SeparatorIzq);
				SeparatorIzq.setLayout(null);
				SeparatorIzq.setBounds(198, 115, 10, 227);
				SeparatorIzq.setOrientation(SwingConstants.VERTICAL);
			}
			{
				etiquetaInstrucciones = new JLabel();
				getContentPane().add(etiquetaInstrucciones);
				etiquetaInstrucciones.setText("Inicio");
				etiquetaInstrucciones.setFont(new java.awt.Font("Arial Rounded MT Bold",1,20));
				etiquetaInstrucciones.setBounds(12, 3, 193, 44);
			}
			{
				fondo = new JLabel();
				FlowLayout fondoLayout = new FlowLayout();
				getContentPane().add(getFondo());
				fondo.setLayout(null);
				fondo.setBounds(0, 0, 611, 360);
				fondo.setIcon(new ImageIcon(getClass().getClassLoader().getResource("res/fondos/fondo1.png")));
			}


			pack();
			this.setSize(614, 384);
		} catch (Exception e) {
			//add your error handling code here
			e.printStackTrace();
		}
	}



	@Override
	public void actionPerformed(ActionEvent e) 
	{
		if(e.getSource()==btnIniciarSesion)
		{		
			String correo= jtfCampoCorreo.getText();
			String clave=jpfCampoClave.getText();

			if (correo.length()!=0 && validacion.esCorreo(correo)==true && clave.length()>5 &&validacion.esNumYLetra(clave)==true) {

				try {
					usuario =conexionUsuario.buscarPorCorreo(correo);
					if (usuario!=null) {
						ventanaInformacion.setVisible(true);
						this.setVisible(false);
					}else{
						JOptionPane.showMessageDialog(this, "<html>Error # 200:<br> La informacion ingresada no hace parte de un Usuario registrado.<html>");
					}

				} catch (Exception e1) {

					e1.printStackTrace();
				}



			}else{
				JOptionPane.showMessageDialog(this, "<html>Error # 200:<br> La informacion ingresada es incorrecta o no hace parte de un Usuario registrado.<html>");
				logger.imprimirMensaje(1,"El usuario escribio un nombre de usuario incorrecto");
			}



		}

		if (e.getSource()==btnCrearCuenta) {
			
			ventanaRegistro.setVisible(true);
			this.setVisible(false);
		}
	}

	public JTextField getJtfCampoCorreo() {
		return jtfCampoCorreo;
	}

	public JPasswordField getJpfCampoClave() {
		return jpfCampoClave;
	}

	public JButton getJbnCrearCuenta() {
		return btnCrearCuenta;
	}

	public JLabel getTiutloPrincipal() {
		return tiutloPrincipal;
	}

	public JLabel getFondo() {
		return fondo;
	}

	public JSeparator getSeparadorArri() {
		return SeparadorArri;
	}

	public JSeparator getSeparatorDer() {
		return SeparatorDer;
	}

	/**
	 * @return the conexionPartida
	 */
	public ConexionPartida getConexionPartida() {
		return conexionPartida;
	}

	/**
	 * @param conexionPartida the conexionPartida to set
	 */
	public void setConexionPartida(ConexionPartida conexionPartida) {
		this.conexionPartida = conexionPartida;
	}

	/**
	 * @return the conexionUsuario
	 */
	public ConexionUsuario getConexionUsuario() {
		return conexionUsuario;
	}

	/**
	 * @param conexionUsuario the conexionUsuario to set
	 */
	public void setConexionUsuario(ConexionUsuario conexionUsuario) {
		this.conexionUsuario = conexionUsuario;
	}

	public MiLogger getLogger() 
	{
		return logger;
	}

	public void limpiarCampos()
	{
		jtfCampoCorreo.setText("");
		jpfCampoClave.setText("");
	}

	/**
	 * @return the hiloInicial
	 */
	public Thread getHiloInicial() {
		return hiloInicial;
	}

	/**
	 * @return the usuario
	 */
	public Usuario getUsuario() {
		return usuario;
	}

	/**
	 * @return the admin
	 */
	public Administrador getAdmin() {
		return admin;
	}

	/**
	 * @param admin the admin to set
	 */
	public void setAdmin(Administrador admin) {
		this.admin = admin;
	}




	/**
	 * @return the ventanaFin
	 */
	public VentanaFin getVentanaFin() {
		return ventanaFin;
	}

	/**
	 * @param ventanaFin the ventanaFin to set
	 */
	public void setVentanaFin(VentanaFin ventanaFin) {
		this.ventanaFin = ventanaFin;
	}
	

	/**
	 * @return the ventanaInformacion
	 */
	public VentanaInformacion getVentanaInformacion() {
		return ventanaInformacion;
	}

	/**
	 * @param ventanaInformacion the ventanaInformacion to set
	 */
	public void setVentanaInformacion(VentanaInformacion ventanaInformacion) {
		this.ventanaInformacion = ventanaInformacion;
	}

	/**
	 * @return the ventanaRegistro
	 */
	public VentanaRegistro getVentanaRegistro() {
		return ventanaRegistro;
	}

	/**
	 * @param ventanaRegistro the ventanaRegistro to set
	 */
	public void setVentanaRegistro(VentanaRegistro ventanaRegistro) {
		this.ventanaRegistro = ventanaRegistro;
	}

	@SuppressWarnings("deprecation")
	public void nuevoJuego(int dificultad) 
	{

		logger.imprimirMensaje(2,"El usuario ha decidido iniciar una nueva partida, tras finalizar la anterior");
		admin = new Administrador(this);
		admin.setDificultad(dificultad);
		hiloInicial.stop();
		hiloInicial = new Thread(new Runnable() {public void run() {iniciarJuego();}});
		construirMundo();
		hiloInicial.start();
	}

	public void iniciarJuego()
	{
		try 
		{
			logger.imprimirMensaje(2,"El usuario ha iniciado una nueva partida");
			admin.game();
		} catch (Exception e) 
		{
			e.printStackTrace();
		}	
	}
	@SuppressWarnings("deprecation")
	public void construirMundo()
	{
		admin.setVentana(new JFrame("Body Invaders"));
		admin.setPanel((JPanel)admin.getVentana().getContentPane());
		admin.setBounds(0,0,Escenario.WIDTH,Escenario.HEIGHT);
		admin.getPanel().setPreferredSize(new Dimension(Escenario.WIDTH,Escenario.HEIGHT));
		admin.getPanel().setLayout(null);
		admin.getPanel().add(admin);
		admin.getVentana().setBounds(0,0,Escenario.WIDTH,Escenario.HEIGHT);
		admin.getVentana().setLocation(0,0);
		admin.getVentana().setCursor(HAND_CURSOR);
		admin.getVentana().setIconImage(new ImageIcon(getClass().getClassLoader().getResource("res/juego/inv02.png")).getImage());
		admin.getVentana().setVisible(true);
		admin.getVentana().addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});
		admin.getVentana().setResizable(false);
		admin.createBufferStrategy(2);
		admin.setStrategy(admin.getBufferStrategy());
		admin.requestFocus();
		admin.addKeyListener(admin);

		admin.setIgnoreRepaint(true);
	}
}
